package com.atguigu.gmall.payment.controlle;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.model.enums.PaymentStatus;
import com.atguigu.gmall.model.enums.PaymentType;
import com.atguigu.gmall.model.payment.PaymentInfo;
import com.atguigu.gmall.payment.config.AliPayConfig;
import com.atguigu.gmall.payment.service.AliPayService;
import com.atguigu.gmall.payment.service.PaymentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @author : zjj
 * @date : 2021/2/7 16:00
 */

@Controller
@RequestMapping("api/payment/alipay")
public class AliPayController {
    /**
     * 支付宝支付service组件
     */
    @Autowired
    private AliPayService aliPayService;

    /**
     * 交易信息管理service组件
     */
    @Autowired
    private PaymentService paymentService;

    /**
     * 提交支付，跳转到支付二维码界面
     * @param orderId   订单id
     * @return          支付二维码字符串
     */
    @GetMapping("submit/{orderId}")
    @ResponseBody
    public String submitOrder(@PathVariable("orderId")Long orderId){

        String from = "";
        try {
            // 该方法调用完成之后，返回的是生产二维码的字符串！
            from = aliPayService.createAliPay(orderId);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        // 如何将from 渲染到页面生产二维码！
        //对应找到from的变量值的html
        return from;

    }

    /**
     * 同步回调地址
     * @return  支付成功，同步回调地址
     */
    @RequestMapping("callback/return")
    public String callBack(){
        return "redirect:" + AliPayConfig.return_order_url;
    }

    /**
     * 异步回调地址：
     *      支付成功之后，会回调我们的地址，
     *      然后我们通过回调来的信息来更新订单的转态
     * @param paramMap  参数
     * @return          结果
     */
    @RequestMapping("callback/notify")
    public String callbackNotify(@RequestParam Map<String,String> paramMap){
// Map<String, String> paramsMap = ... //将异步通知中收到的所有参数都存放到map中
        boolean signVerified = false;
        try {
            //调用SDK验证签名
            signVerified = AlipaySignature.rsaCheckV1(paramMap, AliPayConfig.alipay_public_key, AliPayConfig.charset, AliPayConfig.sign_type);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        // 获取交易状态
        String trade_status = paramMap.get("trade_status");
        String out_trade_no = paramMap.get("out_trade_no");
        // 获取out_trade_no
        if(signVerified){
            // TODO 验签成功后，按照支付结果异步通知中的描述，对支付结果中的业务内容进行二次校验，校验成功后在response中返回success并继续商户自身业务处理，校验失败返回failure
            if ("TRADE_SUCCESS".equals(trade_status) || "TRADE_FINISHED".equals(trade_status)){
                // 更新交易记录的状态！
                // 在更改交易记录状态的时候，需要先做一个判断！如果说当前的交易记录中的状态已经是PAID或者是CLOSE 那么不能更新状态
                // 根据out_trade_no 还有payment_type支付方式
                // select * from payment_info where out_trade_no = out_trade_no and payment_type=ALIPAY
                PaymentInfo paymentInfo = paymentService.getPaymentInfo(out_trade_no, PaymentType.ALIPAY.name());
                // 判断业务
                if (paymentInfo.getPaymentStatus() ==  PaymentStatus.PAID.name() ||
                        paymentInfo.getPaymentStatus() == PaymentStatus.ClOSED.name()){
                    return "failure";
                }
                // 正常支付成功了！更改交易记录状态！
                // update payment_info set payment_status=PAID ,callback_content=paramMap where out_trade_no = out_trade_no and payment_type=ALIPAY
                paymentService.paySuccess(out_trade_no, PaymentType.ALIPAY.name(),paramMap);
                return "success";
            }
        }else{
            // TODO 验签失败则记录异常日志，并在response中返回failure.
            return "failure";
        }
        return "failure";


    }

    /**
     * 退款
     * @param orderId   订单id
     * @return          处理结果
     */
    @RequestMapping("refund/{orderId}")
    @ResponseBody
    public Result refund(@PathVariable("orderId")Long orderId){
        boolean flag = aliPayService.refund(orderId);
        return Result.ok(flag);
    }



}
